#include <iostream>
#include <set>

class ObserveBase   //观察者基类
{
public:
    ObserveBase(const std::string & name)
    {
        this->name = name;
    }
    std::string GetName()
    {
        return name;
    }
    virtual void Update(const std::string & news) = 0;  //更新订阅消息

protected:
    std::string name;
};

class Observer  : public ObserveBase    //具体的观察者
{
public:
    using ObserveBase::ObserveBase;     //继承构造!! 构造一模一样可以用
    void Update(const std::string & news)
    {
        std::cout<<" 我是"<<name<<",我接到了消息："<<news<<std::endl;
    }
};

class TargetBase
{
public:
    void addObserver(ObserveBase * b)       //添加观察者
    {
        Observers.insert(b);
    }
    void RemoveObserve(ObserveBase *b)      //删除观察者
    {
        Observers.erase(b);
    }

    virtual void Broadcast(const std::string & news) = 0;

protected:
    std::set<ObserveBase*> Observers;       //观察者们

};

class Target : public TargetBase            //被观察者
{
public:
    void Broadcast(const std::string & news)    //传播消息
    {
        for(auto & value : Observers)
        {
            value->Update(news);
        }
    }

};

int main()
{

    ObserveBase * b = new Observer("张三");
    ObserveBase * b2 = new Observer("李四");
    ObserveBase * b3 = new Observer("王五");

    TargetBase *t = new Target;     //被观察者
    t->addObserver(b);              //添加观察者
    t->addObserver(b2);
    t->addObserver(b3);

    t->Broadcast("大家好!");        //被观察者广播消息，观察者收到消息
    //我是张三,我接到了消息：大家好!
    //我是李四,我接到了消息：大家好!
    //我是王五,我接到了消息：大家好!

    return 0;
}